package com.rabbiter.hospital.controller;

import com.rabbiter.hospital.pojo.Orders;
import com.rabbiter.hospital.service.OrderService;
import com.rabbiter.hospital.utils.ResponseData;
import com.rabbiter.hospital.utils.TodayUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;

@RestController
@RequestMapping("order")
public class OrderController {
    @Autowired
    private OrderService orderService;

    /**
     * 根据id更新挂号信息
     * 通过POST请求接收客户端发送的更新挂号信息请求
     * @param orders 更新后的挂号信息对象，包含id和其他需要更新的字段
     * @return 包含操作结果的响应数据对象，成功或失败的提示信息
     */
    @PostMapping("updateOrder")
    @ResponseBody
    public ResponseData updateOrder(@RequestBody Orders orders) {
        // 尝试更新数据库中的挂号信息，如果更新成功则返回成功响应，否则返回失败响应
        if (this.orderService.updateOrder(orders)) return ResponseData.success("更新挂号信息成功");
        return ResponseData.fail("更新挂号信息失败！");
    }

    /**
     * 根据id设置缴费状态
     * 该方法用于更新订单的缴费状态，接收一个订单id作为参数，
     * 通过调用订单服务中的更新缴费状态方法来实现
     * @param oId 订单id，用于标识需要更新缴费状态的订单
     * @return 返回一个ResponseData对象，表示操作的结果
     */
    @RequestMapping("updatePrice")
    public ResponseData updatePrice(int oId) {
        if (this.orderService.updatePrice(oId)) return ResponseData.success("根据id设置缴费状态成功");
        return ResponseData.success("根据id设置缴费状态失败");
    }

    /**
     * 查找医生已完成的挂号单
     * 通过此方法，可以查询特定医生已完成的挂号单信息
     * 该方法需要分页信息（pageNumber, size）来返回部分结果，
     * 以及一个查询字符串（query）来过滤结果，
     * 还需要医生的ID（dId）来确定要查询的医生
     * @param pageNumber 当前页码，用于分页查询
     * @param size       每页的大小，用于分页查询
     * @param query      查询字符串，用于过滤挂号单
     * @param dId        医生的ID，用于确定查询的医生
     * @return 包含医生已完成挂号单信息的响应数据对象
     */
    @RequestMapping("findOrderFinish")
    public ResponseData findOrderFinish(int pageNumber, int size, String query, int dId) {
        return ResponseData.success("查找医生已完成的挂号单完成！", this.orderService.findOrderFinish(pageNumber, size, query, dId));
    }

    /**
     * 根据医生ID查询挂号信息
     * @param pageNumber 当前页码，用于分页查询
     * @param size       每页大小，即每页返回的记录数量
     * @param query      搜索关键字，用于根据关键字查询相关的挂号信息
     * @param dId        医生ID，表示要查询的医生
     * @return 包含挂号信息的响应数据对象，成功时包含医生的挂号信息列表
     * <p>
     * 该方法通过医生ID（dId）查询该医生相关的挂号信息，支持分页和关键字搜索功能
     */
    @RequestMapping("findOrderByDid")
    public ResponseData findOrderByDid(int pageNumber, int size, String query, int dId) {
        return ResponseData.success("返回挂号信息成功", this.orderService.findOrderByDid(pageNumber, size, query, dId));
    }

    /**
     * 统计今天挂号人数
     * 通过调用TodayUtil工具类获取今天的日期格式（YYYY-MM-DD），然后调用orderService服务的orderPeople方法
     * 传入今天的日期作为参数，获取今天的挂号人数，并通过ResponseData封装返回成功响应
     */
    @RequestMapping("orderPeople")
    public ResponseData oderPeople() {
        // 获取今天的日期格式（YYYY-MM-DD）
        String oStart = TodayUtil.getTodayYmd();
        // 返回封装了今天挂号人数的成功响应
        return ResponseData.success("统计今天挂号人数成功", this.orderService.orderPeople(oStart));
    }

    /**
     * 统计今天某个医生挂号人数
     * 该方法通过医生ID统计在今天挂号的人数
     * 使用了RequestMapping注解来指定请求的URL路径
     * @param dId 医生的ID，用于识别某个特定医生
     * @return 返回一个ResponseData对象，包含今天的挂号人数信息
     */
    @RequestMapping("orderPeopleByDid")
    public ResponseData orderPeopleByDid(int dId) {
        // 获取今天的日期，格式为YYYY-MM-DD
        String oStart = TodayUtil.getTodayYmd();
        // 调用业务服务统计今天某个医生的挂号人数，并返回成功响应数据
        return ResponseData.success("统计今天挂号人数成功", this.orderService.orderPeopleByDid(oStart, dId));
    }

    /**
     * 获取过去七天的挂号人数
     * 通过循环获取过去七天的日期，并统计每天的挂号人数
     * 返回过去七天的挂号人数列表
     */
    @RequestMapping("orderSeven")
    public ResponseData orderSeven() {
        // 创建一个整数列表来存储每天的挂号人数
        ArrayList<Integer> list = new ArrayList<>();
        // 初始化开始日期字符串
        String oStart = null;
        // 从第20天开始向前遍历到第1天（共20天），获取每天的挂号人数
        for (int i = 20; i > 0; i--) {
            // 获取过去第i天的日期
            oStart = TodayUtil.getPastDate(i);
            // 调用orderService获取指定日期的挂号人数
            int people = this.orderService.orderPeople(oStart);
            // 将挂号人数添加到列表中
            list.add(people);
        }
        // 返回成功响应，包含过去20天的挂号人数列表
        return ResponseData.success("获取过去20天的挂号人数成功", list);
    }

    /**
     * 统计挂号男女人数
     * 通过调用orderService中的orderGender方法来获取挂号的男女人数统计结果
     * 并通过ResponseData包装后返回，确保响应格式的一致性
     */
    @RequestMapping("orderGender")
    public ResponseData orderGender() {
        // 返回统计结果，使用ResponseData的成功状态，携带统计信息
        return ResponseData.success("统计挂号男女人数", this.orderService.orderGender());
    }

    /**
     * 增加诊断及医生意见
     * 通过POST请求接收客户端发送的订单信息更新请求，并尝试在数据库中更新该订单的诊断和医生意见信息
     * @param order 包含更新后的诊断和医生意见信息的订单对象
     * @return 如果更新成功，则返回成功消息及状态码；如果更新失败，则返回失败消息及状态码
     */
    @PostMapping("updateOrderByAdd")
    @ResponseBody
    public ResponseData updateOrderByAdd(@RequestBody Orders order) {
        if (this.orderService.updateOrderByAdd(order)) return ResponseData.success("增加诊断及医生意见成功");
        return ResponseData.fail("增加诊断及医生意见失败");
    }

    /**
     * 判断诊断之后再次购买药物是否已缴费
     * 通过调用orderService中的findTotalPrice方法来检查订单的缴费状态
     * 根据方法返回的结果，返回不同的响应数据
     * 如果未缴费，则返回成功响应数据，携带消息"未缴费"
     * 如果无需缴费，则返回失败响应数据，携带消息"无需缴费"
     * @param oId 订单ID，用于查询特定订单的缴费状态
     * @return ResponseData对象，包含操作结果和相应消息
     */
    @RequestMapping("findTotalPrice")
    public ResponseData findTotalPrice(int oId) {
        if (this.orderService.findTotalPrice(oId)) return ResponseData.success("未缴费");
        return ResponseData.fail("无需缴费");
    }

    /**
     * 请求挂号时间段
     * 通过指定的arId来查找相关的挂号时间段信息
     * 该方法通过HTTP请求提供外部访问能力
     * @param arId 疾病预约ID，是查找挂号时间段的依据
     * @return 返回一个ResponseData对象，包含请求结果和挂号时间段信息
     */
    @RequestMapping("findOrderTime")
    public ResponseData findOrderTime(String arId) {
        // 返回成功响应，包含挂号时间段信息
        return ResponseData.success("请求挂号时间段成功", this.orderService.findOrderTime(arId));
    }

    /**
     * 统计过去20天挂号科室人数
     * 通过调用orderService中的orderSection方法来获取统计数据，并通过ResponseData封装返回结果
     */
    @RequestMapping("orderSection")
    public ResponseData orderSection() {
        // 返回封装好的统计结果
        return ResponseData.success("统计过去20天挂号科室人数成功", this.orderService.orderSection());
    }


}
